const Service = require('../service/auth')
const handPassword = require('../utils/handlePassword')
const errorTypes = require('../const/errorType')
const jwt = require('jsonwebtoken')
const {public_key} = require('../app/config')
class verifyAuth {
  async verifyLogin(ctx, next) {
    console.log('verifyLogin校验密码')
    const {name, password} = ctx.request.body;
    if (!name || !password) {
      const error = new Error(errorTypes.USERNAME_OR_PASSWORD_CANNOT_BE_EMPTY);// 用户名或密码不能为空
      return ctx.app.emit('error', error, ctx); // 将错误事件发送给错误监听器返回给前端同时终止后续的执行

    }
    //判断用户名是否存在
    const result = await Service.getUserByName(name);
    ctx.user = result[0];
    console.log(result, "result");
    if (ctx.user!== undefined) {  //用户名存在
      //判断密码是否正确
      if (ctx.user.password === handPassword(password)) {
        await next();
      } else {
        const error = new Error(errorTypes.PASSWORDS_IS_WRONG);//
        return ctx.app.emit('error', error, ctx); // 将错误事件发送给错误监听器返回给前端同时终止后续的执行
      }
    } else {
      const error = new Error(errorTypes.USER_IS_NOT_EXIST);//
      return ctx.app.emit('error', error, ctx); // 将错误事件发送给错误监听器返回给前端同时终止后续的执行
    }

  }

  async verify_auth(ctx, next) {
    //用户是否授权
    console.log("验证授权的middlewares");
    const authorization = ctx.request.header.authorization; // 获取jwt
    if (authorization) {
      const token = authorization.replace('Bearer ', '');
      try {
        ctx.user = jwt.verify(token, public_key, {
          algorithms: ['RS256']
        });
        console.log(ctx.user, "result");
        if (ctx.user) {
          await next();
        } else {
          const error = new Error(errorTypes.TOKEN_IS_WRONG);
          return ctx.app.emit('error', error, ctx);
        }
      }catch (e) {
        console.log(e);
        const error = new Error(errorTypes.TOKEN_IS_NOT_EXIST);//
        return ctx.app.emit('error', error, ctx); // 将错误事件发送给错误监听器返回给前端同时终止后续的执行
      }
    }
  }
  async verifyPermission(ctx,next){
    //是否是用户自己的文章
    console.log("验证verifyPermission的middlewares");
    const [resourceKey] = Object.keys(ctx.params);
    const tableName = resourceKey.replace('Id', '');
    const resourceId = ctx.params[resourceKey];
    const userId = ctx.user.id;
      const isPermission = await Service.verifyPermission(tableName,resourceId  ,userId);
      if(isPermission) {
        await next();
      }else {
        const error = new Error(errorTypes.PERMISSION_DENIED);
        return ctx.app.emit('error', error, ctx);
      }
    }
}

module.exports = new verifyAuth();